package mathutil.bigdecimal;

import org.testng.Assert;
import org.testng.annotations.Test;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;


/**
 * 注意事项
 * 1 创建BigDecimal对象的时候，使用valueOf方法，不能直接传入一个浮点数进行初始化，因为浮点数不能精确表示
 * 2 比较两个BigDecimal对象，一般使用compareTo，在严格比较精度的时候使用equals；与0比较的时候，使用compareTo
 * 3 两个BigDecimal对象在计算时必须设置舍入模式和精度
 * 4 BigDecimal对象打印时支持多种显示模式
 *
 * BigDecimal能够进行高精度计算的原理也非常简单，虽然十进制小数不一定都能用二进制表示，但是十进制整数一定能用二进制表示，所以BigDecimal的方案就是对小数
 * 进行放大，使得最终能够在整数的维度上进行计算并保留精度信息
 *
 *
 */
public class MyBigDecimal {


    @Test
    public void t1() {
        BigDecimal bigDecimal = new BigDecimal(0.1);
        BigDecimal value = BigDecimal.valueOf(0.1);

        System.out.println(bigDecimal);  // 0.1000000000000000055511151231257827021181583404541015625
        System.out.println(value);  // 0.1

//        Assert.assertTrue(, "assertTruewow");
    }

    @Test
    public void t2() {
        final BigDecimal bigDecimal = BigDecimal.valueOf(0.01);
        final BigDecimal bigDecimal2 = BigDecimal.valueOf(0.010);
        int res = bigDecimal.compareTo(bigDecimal2);
        Assert.assertEquals(res, 0); // true
        boolean equals = bigDecimal.equals(bigDecimal2);
        Assert.assertTrue(equals); // true


        BigDecimal bigDecimal3 = new BigDecimal("0.01");
        BigDecimal bigDecimal4 = new BigDecimal("0.010");
        int res2 = bigDecimal3.compareTo(bigDecimal4);
        Assert.assertEquals(res2, 0); // true
        boolean equals2 = bigDecimal3.equals(bigDecimal4);
        Assert.assertTrue(equals2); // false，精度不同

    }


    @Test
    public void test3(){
        BigDecimal a = BigDecimal.valueOf(1.0);
        BigDecimal b = BigDecimal.valueOf(3.0);
        // 如果在除法（divide）运算过程中，如果商是一个无限小数（0.333…），
        // 而操作的结果预期是一个精确的数字，那么将会抛出ArithmeticException异常。
//        a.divide(b);

        // 计算除法时必须设置取舍模式，舍入模式有8种，一般使用四舍五入
        final BigDecimal divide = a.divide(b, RoundingMode.HALF_UP);
        System.out.println(divide);
    }

    @Test
    public void test4(){
        BigDecimal a = BigDecimal.valueOf(35634535255456719.22345634534124578902);
        System.out.println(a.toString());
        System.out.println(a.toPlainString());
    }

    @Test
    public void test5() {
        final BigDecimal bigDecimal = new BigDecimal("0.1", new MathContext(10, RoundingMode.HALF_UP));
        final BigDecimal bigDecimal2 = new BigDecimal(2, new MathContext(10, RoundingMode.HALF_UP));
        final BigDecimal divide = bigDecimal.divide(bigDecimal2);

    }




}
